#ifndef SUBWIDGET1_H
#define SUBWIDGET1_H

#include <QWidget>
#include <QSqlDatabase>
#include <QTimer>
#include <qcustomplot.h>

#include "subwidget2.h"
class QLabel;
class SubWidget_Serial;
class MyThreadForSubwidget1;

namespace Ui {
class SubWidget1;
}

class SubWidget1 : public QWidget
{
    Q_OBJECT
    friend class MyThreadForSubwidget1;
public:
    //我将构造函数由官方提供的，改成了如下
    //explicit SubWidget1(QWidget *parent = nullptr);
    explicit SubWidget1(QSqlDatabase &db, SubWidget_Serial &Serial, QWidget *parent = nullptr);
    void setDataBase(QSqlDatabase &db);             //设置当前的数据库指向外部传入的数据库

    void chart_init(QCustomPlot *customPlot ,const QVector<int>& v, double upper_yAxis=700, QString title=NULL);        //初始化每个graph的格式
    void plot_chart(QCPGraph *graph ,double data, double cnt2=0);          //graph：目标曲线  data：待添加的数据

    //解析Json文件用
    QByteArray read_json(QString path, QString key);
    unsigned int crc_cjl_value(unsigned char *data_value, unsigned char length);       //计算crc校验码

    //返回当前对象的ui,方便外界对象调用类似plot_chart函数时，传入ui->graph之类的参数时候用，但暂时未用到，因为在mainwindow.cpp中创的是其的父类对象SubQWidget，无法调用我们子类写的这些public函数
    const Ui::SubWidget1& get_Ui() const;

    ~SubWidget1();
protected:
    void closeEvent(QCloseEvent *event);
private:
    Ui::SubWidget1 *ui;
    SubWidget2* m_sub2;
    SubWidget_Serial* m_Serial;

    int m_speed1;
    int m_speed2;
    QSqlDatabase m_db;

    //SubWidget1::MyThreadForSubwidget1 *thread_w1;       //这里是指针时，前面只需前置声明一下即可，如果不是指针，则前面必须要包含头文件
    MyThreadForSubwidget1 *thread_w1;

private:
    void TimeData_Update(QCustomPlot *customPlot ,const QVector<int>& v, double orignt_time, double data=0, bool is_write=false);   //每隔一段时间，通过connect调用一下这个函数，将传入的customPlot的每一个graph曲线通过plot_chart(QCPGraph *graph ,double data)画一遍
    void set_Qlabel(int index, double data=0);

private slots:
    void test_to_use_TimeData_Update(int index, double data);

//private:
//    friend class MyThreadForSubwidget1;
//    class MyThreadForSubwidget1:public QThread
//    {
//        Q_OBJECT
//    public:
//        //虽然这个MyThread类属于SubWidget1的私有类，但是两者其实完全不相关，和其他的如SubWidget1和2两个类的关系一样，唯一区别只是这个MyThread类仅可以被SubWidget1来实例化并调用
//        //所以我们想要让MyThead类访问SubWidget1的方法和属性，就和两个完全不相关的类想互相访问一样，首先将SubWidget1的this指针传递进来，再将自身类设置为其的友元，这样就实现了调用一个完全不相关的类的所有属性和函数
//        MyThreadForSubwidget1(SubWidget1 *subWidget1_this);
//        ~MyThreadForSubwidget1();
//    protected:
//        void run();        //QThread的虚函数，线程处理函数，具体可见博客
//    private:
//        SubWidget1 *m_subWidget1_this;
//    };

};

#endif // SUBWIDGET1_H
